/******************************************************************************
 * Copyright (C) 2025 EternalChip, Inc.(Gmbh) or its affiliates.
 * 
 * All Rights Reserved.
 * 
 * @file bsp_led.h
 * 
 * @par dependencies 
 * - stdio.h
 * - stdint.h
 * - main.h
 * - cmsis_os.h
 * - queue.h
 * - stm32f4xx_hal.h
 * - stm32f4xx_hal_gpio.h
 * @author zy 
 * 
 * @brief Provide the HAL APIs of key and corresponding opetions.
 * 
 * Processing flow:
 * 
 * call directly.
 * 
 * @version V1.0 2025-4-20
 *
 * @note 1 tab == 4 spaces!
 * 
 *****************************************************************************/

#ifndef __BSP_KEY_H__
#define __BSP_KEY_H__

//******************************** Includes *********************************//


#include <stdint.h>               
#include <stdio.h>

#include "main.h"                 
#include "cmsis_os.h"


#include "queue.h"                
#include "stm32f4xx_hal.h"        
#include "stm32f4xx_hal_gpio.h"

//******************************** Includes *********************************//

//******************************** Defines **********************************//

//*****************************Thread_Func **********************************//

extern osThreadId_t key_TaskHandle;                         /*key任务句柄    */
extern const osThreadAttr_t key_Task_attributes;            /*key线程句柄    */

//*****************************Thread_Func **********************************//

//****************************Queue_Handler ********************************//

extern QueueHandle_t key_queue;

//****************************Queue_Handler ********************************//
/*  KEY状态（key_status_t）返回值                                            */
typedef enum
{
  KEY_OK                = 0,           /* 正常执行                           */
  KEY_ERROR             = 1,           /* 执行错误                           */
  KEY_ERRORTIMEOUT      = 2,           /* 执行超时                           */
  KEY_ERRORRESOURCE     = 3,           /* 资源不可用                         */
  KEY_ERRORPARAMETER    = 4,           /* 参数错误                           */
  KEY_ERRORNOMEMORY     = 5,           /* 内存不足                           */
  KEY_ERRORISR          = 6,           /* ISR执行错误                        */
  KEY_RESERVED          = 0x7FFFFFFF   /* 保留值                             */
} key_status_t;
/*  KEY操作（key_press_status_t）返回值                                      */
typedef enum
{
  KEY_PRESSED           = 0,           /* 按键按下                           */
  KEY_NOT_PRESSED       = 1,           /* 按键释放                           */
  KEY_SHORT_PRESSED     = 2,           /* 按键短按                           */
  KEY_LONG_PRESSED      = 3            /* 按键长按                           */
} key_press_status_t;

//******************************** Defines **********************************//

//******************************** Declaring ********************************//
/**
 * @brief 按键扫描函数
 * 
 * @param[in] * key_value               //按键操作（键码值）
 * 
 * @return key_status_t                 //按键状态
 * 
 * */
key_status_t key_scan      (key_press_status_t * key_value);

/**
 * @brief 按键长短按扫描函数
 *  
 * @param[in] * key_value               //按键操作（键码值）
 *              short_press_time        //短按时间阈值  
 * 
 * @return key_status_t                 //按键状态
 * 
 * */
key_status_t key_scan_short_long_press(key_press_status_t * key_value       ,
                                                 uint32_t   short_press_time);

/**
 * @brief KEY任务队列创建、消息接收
 * 
 * Steps:
 *  
 *  
 * @param[in] void *
 * 
 * @return 无
 * 
 * */
void         key_task_func                 (void *argument);

//******************************** Declaring ********************************//




#endif // End of __BSP_KEY_H_

